package com.ywu.application.standard.thirdExec.exec;

import com.ywu.file.sys.sdk.enter.YwuFileSysExec;
import com.ywu.application.standard.thirdExec.entity.YwuThirdExecEntity;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName YwuThirdExecEngine
 * @Description TODO
 * @Author GroundDemo
 * @Date 2024/10/14 11:11
 * @Version 1.0
 **/
public interface YwuThirdExecEngine {
    // 获取当前执行引擎的类型
    String execType();

    // 执行操作
    Object exec(YwuThirdExecEntity entity);

    /**
     * @Author GroundDemo
     * @Description 下载脚本文件
     * @Date 16:26 2024/10/14
     * @Param [entity]
     * @return java.io.File
     **/
    default String downloadThirdFile(YwuThirdExecEntity entity, YwuFileSysExec ywuFileSysExec) {
        // 根据url获取对应的fileId
        String contentUrl = entity.getContentUrl();
        String[] urlList = contentUrl.split("/");
        String fileId = urlList[urlList.length - 1];
        // 下载文件，返回文件的路径
        return ywuFileSysExec.download(fileId);
    }

    /**
    * @Author GroundDemo
    * @Description 根据方法名称获取对应对象中的方法
    * @Date 16:41 2024/10/18
    * @Param [clazz, execMainMethodName]
    * @return java.lang.reflect.Method
    **/
    default Method getMethod(Class<?> clazz, String execMainMethodName) {
        // 获取要执行的方法
        Method execMethod = null;
        Method[] methods = clazz.getMethods();
        for (Method mth : methods) {
            if (StringUtils.equalsIgnoreCase(mth.getName(), execMainMethodName)) {
                execMethod = mth;
                break;
            }
        }
        return execMethod;
    }

    /**
    * @Author GroundDemo
    * @Description 根据方法中的参数与入参进行匹配
    * @Date 16:41 2024/10/18
    * @Param [execMethod, paramMap]
    * @return java.util.List<java.lang.Object>
    **/
    default List<Object> getExecParams(Method execMethod, Map<String, Object> paramMap) {
        Parameter[] parameters = execMethod.getParameters();
        List<Object> params = new ArrayList<>();
        for (Parameter parameter : parameters) {
            String name = parameter.getName();
            if (paramMap.containsKey(name)) {
                // 如果入参中存在对应的参数，则获取传入的值，否则直接填入null
                Object p = paramMap.get(name);
                params.add(p);
            } else {
                params.add(null);
            }
        }
        return params;
    }
}
